釋放、標記、分配的部分已經初步實現。
所以今天来測試一下 ~
釋放、標記、分配部分的代碼整合了,
很長所以放在了下一篇文章。
free_all_register_address
有沒有生效?int main() {
/*空間載體*/
int *ptr;
/*動態建立了空間*/
new_1d(&ptr, 3, sizeof(int));
/*賦值*/
ptr[0] = 2;
ptr[1] = 5;
ptr[2] = 8;
/*遍歷列印*/
for (int i = 0; i < 3; i++) {
printf("%d ", ptr[i]);
}
/*觸發雙重釋放 (double free) */
free(ptr);
system("pause");
return 0;
}
先廢話說一下幹了什麼,你可以直接跳到下面的測試目的:
有一個命名為 ptr
的指標,透過 new_1d
動態建立了空間。
空間共有 3*sizeof(int)
= 3*4 = 12 字節。
按照 ptr 的類型 ( int*
) ,以每 sizeof(int)
個字節 切割/分為 一格,
所以共 3 格 , int
類型。
很囉嗦...,不過這是比較具體、詳細的情況,下一次就不用這樣的方式說了。
然後對 ptr 的空間賦值,因為連續空間已分配,這時候可以當陣列看待。
遍歷列印驗證結果,再加一個 free(ptr);
去觸發雙重釋放。
暫停,回傳 0 ,結束主程序。
然後觸發 free_all_register_address
。
先測試有沒有自動釋放了地址,
即 free_all_register_address
有沒有被運行。
如果 free_all_register_address
沒有生效,
就會造成內存洩漏,所以先在主程序中放了 free(ptr);
,
即使沒有生效也不用擔心,不會內存洩漏,
如果生效了就會造成雙重釋放 ( double free ) ,證實生效。
輸出:
2 5 8 Press any key to continue . . .
成功在 free_all_register_address
觸發中斷點,發生錯誤。
因為該空間已被釋放,沒有權限, free(ptr);
讀取存取違規。
證實 free_all_register_address
有生效,
並且進行了釋放的動作。
int main() {
/*空間載體*/
int *ptr;
/*動態建立了空間*/
new_1d(&ptr, 3, sizeof(int));
/*賦值*/
ptr[0] = 2;
ptr[1] = 5;
ptr[2] = 8;
ptr[3] = 11;
/*遍歷列印*/
for (int i = 0; i < 4; i++) {
printf("%d ", ptr[i]);
}
system("pause");
return 0;
}
跟上面差不多,只是來測試數組越界,賦值了 ptr[3]
,
目的是確認分配的空間長度正常。
輸出:
2 5 8 11 Press any key to continue . . .
可以賦值和讀取,但這不代表什麼...。
又成功觸發中斷點了。
去除 ptr[3] = 11;
和修改為 i < 3
後正常運作,
證明分配的空間長度應該正常。
說“應該正常”是因為我也不是完全融會貫通指標的,
說不定出錯了我也不知道,有疑問、問題或者錯誤歡迎提出~~~
我們還有一些問題要處理,像是全域變數之類的,
還可以進行代碼重構,完善所有功能,
用巨集增加效率,簡化代碼量。